package com.markhsiu.mysql.packet.server;

import com.markhsiu.mysql.packet.MySQLMessage;
import com.markhsiu.mysql.packet.MysqlPacket;
import com.markhsiu.mysql.packet.PacketReadable;

/**
 * 握手消息,即服务端向客户端写入消息
 * @author Administrator
 *
 */
public class HandshakePacket extends MysqlPacket  implements PacketReadable{

	/**
	 * 服务协议版本号：该值由 PROTOCOL_VERSION
	 * 宏定义决定（参考MySQL源代码/include/mysql_version.h头文件定义），抓包显示协议版本号为10
	 */
	public byte protocolVersion;
	
	/**
	 * 服务版本信息：该值为字符串，由 MYSQL_SERVER_VERSION
	 * 宏定义决定（参考MySQL源代码/include/mysql_version.h头文件定义），抓包显示mysql服务器版本为5.6.22
	 */
	public byte[] serverVersion;
	
	/**
	 * 服务器线程ID：服务器为当前连接所创建的线程ID。因为客户端创连接到服务器，服务器分配给单独的进程，
	 * 抓包显示进程号为5，可通过登陆键入show
	 * process list验证
	 */
	public long serverThreadId;
	
	/**
	 * 战随机数：8位,MySQL数据库用户认证采用的是挑战/应答的方式，服务器生成该挑战数并发送给客户端，由客户端进行处理并返回相应结果，
	 * 然后服务器检查是否与预期的结果相同，从而完成用户认证的过程
	 */
	public byte[] challengeRandom;
	
	/**
	 * 服务器权能标志：用于与客户端协商通讯方式，各标志位含义如下（参考MySQL源代码/include/mysql_com.h中的宏定义）
	 */
	public int serverCapabilities;
	
	/**
	 * 字符编码：标识服务器所使用的字符集
	 */
	public byte serverCharsetIndex;
	
	/**
	 * 服务器状态：状态值定义如下（参考MySQL源代码/include/mysql_com.h中的宏定义）
	 */
	public int serverStatus;
	
	public int serverCapabilitiesExtended;
	
	public byte authPluginLength;
	
	public byte[] unnsed;
	
	public byte[] restOfScrambleBuff;
	
	@Override
	public void read(MySQLMessage message) {
		  message.position(0);
		  length = message.readUB3();
		  number = message.read();
		  
		  protocolVersion = message.read();
		  serverVersion = message.readBytesWithNull();
		  serverThreadId = message.readUB4();
		  challengeRandom = message.readBytes(8);
		  message.skip(1);
		  serverCapabilities = message.readUB2();
		  System.out.println("服务器权能标志 :" +Integer.toString(serverCapabilities, 16) );
		  serverCharsetIndex = message.read();
		  serverStatus = message.readUB2();
		  System.out.println("服务器状态 :" +Integer.toString(serverStatus, 16) );
//		  message.skip(13);
		  serverCapabilitiesExtended = message.readUB2();
		  authPluginLength = message.read();
		  unnsed = message.readBytes(10);
		  restOfScrambleBuff = message.readBytesWithNull();
	}


	@Override
	public String descrption() {
		StringBuilder sb = new StringBuilder();
		sb.append("protocol:");
		sb.append((int)protocolVersion);
		sb.append(" ");
		sb.append("version:");
		sb.append(new String(serverVersion));
		return sb.toString();
	}

}
